package doing.doing_001_500;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import static com.study.util.LogUtil.info;

/**
 * 400. Nth Digit
 * <p>
 * 在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字。
 * <p>
 * 注意:
 * n 是正数且在32为整形范围内 ( n < 2^31 )。
 * <p>
 * 示例 2:
 * 输入: 11
 * 输出: 0  因为 9、10、11 (0正好是第11个)
 * 2019-03-24 9:33 PM
 **/
@Slf4j
public class NthDigit {

    @SuppressWarnings("all")
    public int findNthDigit(int n) {
        //第n位数字是一个几位数？
        //i:位数  s:这一位有多少个数 base：某几位数的第一个数
        long i = 1;
        long s = 9;
        long base = 1;
        while (n > i * s) {
            n -= i * s;
            i++;
            s *= 10;
            base *= 10;
        }
        //第n位数字属于哪一个数字？
        //用向下取整代替向上取整
        long number = base + (n + i - 1) / i - 1;
        //在这个数字的第几位？
        long r = (n % i == 0 ? i : n % i);

        for (int j = 0; j < i - r; j++) {
            number /= 10;
        }
        return (int) number % 10;
    }

    @Test
    public void test() {
        info(findNthDigit(11));
    }

}
























/*
public int findNthDigit(int n) {
    //第n位数字是一个几位数？
    //i:位数  s:这一位有多少个数 base：某几位数的第一个数
    long i = 1, s = 9, base = 1;
    while(n > i * s)
    {
        n -= i * s;
        i ++;
        s *= 10;
        base *= 10;
    }
    //第n位数字属于哪一个数字？
    //用向下取整代替向上取整
    long number = base + (n + i - 1) / i - 1;
    //在这个数字的第几位？
    long r = n % i == 0 ? i : n % i;
    for(int j = 0; j < i - r; j ++) number /= 10;
    return (int) number % 10;
}
*/
